﻿using FuzzySharp;
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;

namespace MaiYao
{
    public delegate void Func();
    public delegate bool 过图操作_();
    public delegate bool 判断_();
    public delegate bool 包裹回调_(Point p);

    public enum 挂机项目_
    {
        无 = 0,
        买药 = 1,
        扔药 = 2,
        捡药 = 3,
    }

    public enum 三态_
    {
        假_,
        真_,
        其他_
    }

    class 消息数据_ 
    {
        public 消息数据_( string 头部, string 内容)
        {
            this.头部 = 头部;
            this.内容 = 内容;
        }

        public override string ToString()
        {
            return this.头部 + this.内容;
        }

        public string 头部 { get; private set; }
        public string 内容 { get; private set; }
    }

    class 其他_
    {
        public static int 时长_50 = 50;
        public static int 时长_100 = 100;
        public static int 时长_200 = 200;
        public static int 时长_400 = 时长_200 * 2;
        public static int 时长_600 = 时长_200 * 3;
        public static int 时长_800 = 时长_200 * 4;
        public static int 时长_1000 = 时长_200 * 5;
        public static int 时长_1200 = 时长_200 * 6;
        public static int 时长_1400 = 时长_200 * 7;
        public static int 时长_1800 = 时长_200 * 8;
        public static int 时长_2000 = 时长_200 * 10;
        public static int 时长_3000 = 时长_200 * 15;
        public static int 时长_5000 = 时长_200 * 25;
        public static int 时长_10000 = 时长_200 * 50;

        public static double 运行速率 = 1;
        public static readonly Regex 数字过滤正则 = new Regex(@"[^\d]", RegexOptions.Compiled);

        static 其他_()
        {
            if (IsTextAllowed(MainWindow._this.运行速率.Text))
            {
                try
                {
                    运行速率 = double.Parse(MainWindow._this.运行速率.Text);
                }
                catch
                {
                    运行速率 = 1;
                }
                if (运行速率 < 0.5) 运行速率 = 0.5;
                else if (运行速率 > 2) 运行速率 = 2;
            }
        }

        public static bool IsTextAllowed(string text)
        {
            // 允许数字、小数点和负号
            Regex regex = new Regex(@"^[0-9.]+$");
            return regex.IsMatch(text);
        }

        public static Random R = new Random();

        public static int 随机数(int 最大值)
        {
            return R.Next(最大值);
        }

        public static void 延迟(int 时长)
        {
            Thread.Sleep((int)(时长 * 运行速率));
        }

        public static void 打印(string 内容)
        {
            var _this = MainWindow._this;
            DateTime now = DateTime.Now;
            var 数据 = new 消息数据_(now.ToString("HH:mm:ss") + ": ", 内容);
            if (_this.listBox.Items.Count == 0)
            {
                _this.Dispatcher.Invoke(() =>
                {
                    _this.listBox.Items.Add(数据);
                    _this.listBox.ScrollIntoView(_this.listBox.Items[_this.listBox.Items.Count - 1]);
                });
                return;
            }
            var 最后一条 = (消息数据_)_this.listBox.Items[_this.listBox.Items.Count - 1];
            if (最后一条.内容 != 内容)
            {
                _this.Dispatcher.Invoke(() =>
                {
                    _this.listBox.Items.Add(数据);
                    _this.listBox.ScrollIntoView(_this.listBox.Items[_this.listBox.Items.Count - 1]);
                });
            }
            return;
        }

        public static Point 取中心(int x, int y, int x2, int y2)
        {
            return new Point((int)(x + (x2 - x) / 2), (int)(y + (y2 - y) / 2));
        }

        public static Point 取中心(Rectangle rect)
        {
            return new Point((int)(rect.Left + rect.Width / 2), (int)(rect.Top + rect.Height / 2));
        }

        public static bool 点在有效范围内(Rectangle 范围, Point 测试点)
        {
            GraphicsPath 多边形 = new GraphicsPath();
            多边形.AddRectangle(范围);
            多边形.CloseFigure();
            return 多边形.IsVisible(测试点);
        }

        public static bool 文本相似(string 要检测的文本, string 目标文本)
        {
            return Fuzz.Ratio(要检测的文本, 目标文本) >= 50;
        }

        public static bool 循环判断(判断_ func, int 最大次数 = 1, int 单次时长 = 500)
        {
            if (最大次数 == 1)
            {
                延迟(单次时长);
                return func();
            }
            var i = 0;
            do
            {
                延迟(单次时长);
                i++;
                if (func()) return true;
            }
            while (i < 最大次数);
            return false;
        }

       public static string 创建文件夹()
        {
            // 获取程序运行目录
            string 程序目录 = AppDomain.CurrentDomain.BaseDirectory;

            // 组合完整路径
            string 完整路径 = Path.Combine(程序目录, "错误采集");

            // 检查文件夹是否存在
            if (!Directory.Exists(完整路径))
            {
                // 不存在则创建
                Directory.CreateDirectory(完整路径);
            }
            return 完整路径;
        }
    }
}
